﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Common;
using System.Data.SqlClient;
using System.Data;

namespace DataLayer
{
    public static class DatUser
    {
        public static dsBoleto GetUsuarioAndRoles(int Id)
        {
            //Cargo el Parametro en el manejador de params SQL.-
            Util.DBParameter IdUsr;
            IdUsr.dbType = System.Data.DbType.Int32;
            IdUsr.parameterName = "@IdUser";
            IdUsr.value = Id;

            //Genero el SQLCommando con el Util Builder
            SqlCommand este = Util.SQLCommandBuild("UsuariosRolesFuncionalidadesGet", IdUsr);

            ///Genero el listado de tablas a donde cargar esta data.
            ///Quizas hay tablas innecesarias pero que vienen en el query...
            ///Se mandan igual para que no falle la consulta.
            List<string> Tablas = new List<string>();
            Tablas.Add("Usuario");
            Tablas.Add("Rol");
            Tablas.Add("Funcionalidad");
            Tablas.Add("Usuario_x_Rol");
            Tablas.Add("Funcionalidad_x_Rol");

            return Util.SelectSPtoDatasetSolve(este, Tablas.ToArray());
        }

        public static int NewUsuario(string UserName, string Password)
        {
            Util.DBParameter User;
            Util.DBParameter Pass;
            List<Common.Util.DBParameter> parameters = new List<Util.DBParameter>();

            User.dbType = System.Data.DbType.String;
            User.parameterName = "@User";
            User.value = UserName;
            parameters.Add(User);

            Pass.dbType = System.Data.DbType.String;
            Pass.parameterName = "@Pass";
            Pass.value = Password;
            parameters.Add(Pass);

            SqlCommand miCommand = Util.SQLCommandBuild("UsuarioIns", parameters);

            return int.Parse(miCommand.ExecuteScalar().ToString());
        }

        /// <summary>
        /// Realiza un Update sobre la tabla Usuarios
        /// </summary>
        /// <param name="MisParametros">Listado de parametros</param>
        public static void UpdateUsuario(List<Util.DBParameter> MisParametros)
        {
            Util.SQLCommandBuild("UsuariosUpd", MisParametros).ExecuteNonQuery();
            
        }

        public static void DeleteUsuarioRoles(int Id)
        {
            Util.DBParameter pId;
            pId.dbType = System.Data.DbType.Int32;
            pId.parameterName = "@Id";
            pId.value = Id;
            Util.SQLCommandBuild("UsuarioRolesDel", pId).ExecuteNonQuery();
        }

        public static void NewUsuarioRoles(int Id, List<int> NewRoles)
        {
            /// Arma un SELECT de UNIONS con el objetivo de 
            /// Insertar un select en la tabla de Usuario_x_Rol
            ///
            /// Atencion! No se valida que el usuario exista. 
            /// Esto pinchará si se hace esa operación.
            /// 
            StringBuilder sbSelect = new StringBuilder();
            sbSelect.Append("(");
            for (int i = 0; i < NewRoles.Count; i++)
            {
                sbSelect.Append("(SELECT ");
                sbSelect.Append(Id);
                sbSelect.Append(" IdUser, ");
                sbSelect.Append(NewRoles[i]);
                sbSelect.Append(" IdRol) ");
                if (i != NewRoles.Count - 1)
                {
                    sbSelect.Append("UNION ");
                }
            }
            sbSelect.Append(")");
            Util.DBParameter pQuery = new Util.DBParameter("@QueryUnions", sbSelect.ToString(), System.Data.DbType.String);
            Util.DBParameter pId = new Util.DBParameter("@IdUser", Id, DbType.Int32);
            Util.SQLCommandBuild("UsuarioRolesIns", pQuery).ExecuteNonQuery();
        }

        public static void GetUsuarios(string UsernameLike, List<int> Roles, bool SoloHabilitados)
        {
            List<Util.DBParameter> MisParams = new List<Util.DBParameter>();
            MisParams.Add(new Util.DBParameter("@UsernameLike", UsernameLike, DbType.String));
            MisParams.Add(new Util.DBParameter("@SoloHabilitados", SoloHabilitados, DbType.Boolean));
            MisParams.Add(Util.BuildSelectQueryUnions(Roles));
            Util.SelectSPtoDatasetSolve(Util.SQLCommandBuild("UsuariosGet", MisParams),new string[]{"Usuario"});
            
        }

        
    }
}
